package services

import (
	"rbac-abac-demo/models"
	"rbac-abac-demo/utils"
	"time"
)

// ConditionChecker 定义条件检查函数类型
type ConditionChecker func(user *models.User, conditionValue interface{}) bool

// 全局注册表：条件名 → 检查函数
var Checkers = map[string]ConditionChecker{
	"dept":      checkDept,
	"is_active": checkActive,
	"age":       checkAge,
	"weekday":   checkWeekday, // 新增！
}

// ======================
// 条件检查函数实现
// ======================

func checkDept(user *models.User, value interface{}) bool {
	return user.Dept == value
}

func checkActive(user *models.User, value interface{}) bool {
	v, ok := value.(bool)
	return ok && user.IsActive == v
}

func checkAge(user *models.User, value interface{}) bool {
	if m, ok := value.(map[string]interface{}); ok {
		if minVal, hasMin := m["min"]; hasMin {
			return float64(user.Age) >= minVal.(float64)
		}
		// 可扩展：max, range 等
	}
	return false
}

func checkWeekday(user *models.User, value interface{}) bool {
	// 只有当 value == true 时才检查
	v, ok := value.(bool)
	if !ok || !v {
		return true // 不启用则跳过
	}
	now := time.Now().Weekday()
	return now != time.Saturday && now != time.Sunday
}

// ======================
// 主 ABAC 检查入口
// ======================

func CheckABAC(user *models.User, resource, action string) bool {
	for _, p := range utils.ABACPolicies {
		if p.Resource == resource && p.Action == action {
			// 遍历所有条件
			for key, cond := range p.Conditions {
				checker, exists := Checkers[key]
				if !exists {
					return false // 不支持的条件 → 拒绝（也可设计为跳过）
				}
				if !checker(user, cond) {
					return false
				}
			}
			return true
		}
	}
	return false // 无匹配策略
}
